package com.spring.mvc.controller;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.spring.mvc.bean.DireccionNormalizada;
import com.spring.mvc.bean.DireccionResponse;
import com.spring.mvc.bean.T0003maesDire;
import com.spring.mvc.bean.T0008maesDepa;
import com.spring.mvc.bean.T0009maesProv;
import com.spring.mvc.bean.T0010maesDist;
import com.spring.mvc.bean.UbigeoBean;
import com.spring.mvc.service.DireccionService;
@Controller("georeferenciaController")
@Scope("session")
public class GeoreferenciaController {
	// LIMPIAR
	//
	
	public String cadenaJson2;
	//
  private List<DireccionNormalizada> listaDirec=new ArrayList<DireccionNormalizada>();
  //
	//
	
	//
	//
  private T0008maesDepa depa=new T0008maesDepa();
  private T0009maesProv provicia=new T0009maesProv();
  private T0010maesDist distrito=new T0010maesDist();
  private String direccion;
  private List<T0003maesDire> listaDirecPadron;
  
  private List<String> itemsDireccion; // +getter
  @Value( "${url_web_geo}" )  
  private String uri;
  @Value( "${url_web_direc}" )  
  private String uri_direc;
  //public final static String uri="http://192.168.1.36:7001/sunat/address/find";
  @Autowired
  private DireccionService direccionService;

	public void ini(){
    	System.out.println("georeferencia");
    	//listColaborador = colaboradorService.readAll();
    	limpiar();
    	if(listaDirec.isEmpty()){
           // FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,"", "No se encontraron elementos!"));
        }
    	
    }

	public List<DireccionNormalizada> getListaDirec() {
		return listaDirec;
	}

	public void setListaDirec(List<DireccionNormalizada> listaDirec) {
		this.listaDirec = listaDirec;
	}
	
	// LIMPIAR
	//
	//
	public void limpiar(){
		listaDirec=new  ArrayList<DireccionNormalizada>();
		itemsDireccion=new ArrayList<String>();
		
	}
	
	//
	//
	
	//
	//
	public void procesar(){ 
		System.out.println("Procesar");
//		String depa="LIMA";
//		String prov="LIMA";
//		String dist="SAN ISIDRO";
//		String direccion="Av Javier Prado 350 San Isidro";
		String ubigeo=null;
		StringBuilder cadenaJson=new StringBuilder();
		UbigeoBean ubigeoBean=null;
		if(itemsDireccion!=null && itemsDireccion.size()>0){
			cadenaJson.append("{");
			cadenaJson.append("\"direcciones\":");
			cadenaJson.append("[");
			for (int i = 0; i < itemsDireccion.size(); i++) {
				ubigeo=itemsDireccion.get(i).split("-")[0];
				ubigeoBean=direccionService.selectUbigeo(ubigeo);
				if(ubigeoBean!=null){
					direccion=itemsDireccion.get(i).split("-")[1];
					cadenaJson.append("{");
					cadenaJson.append("\"Direccion Original\":").append("\"").append(direccion).append("\",\n");
					cadenaJson.append("\"Departamento\":").append("\"").append(ubigeoBean.getNomDepa().trim()).append("\",\n");
					cadenaJson.append("\"Provincia\":").append("\"").append(ubigeoBean.getNomProvincia().trim()).append("\",\n");
					cadenaJson.append("\"Distrito\":").append("\"").append(ubigeoBean.getNomDistrito().trim()).append("\"\n");
					cadenaJson.append("}").append("\n");
					if(i!=itemsDireccion.size()-1){
						cadenaJson.append(",").append("\n");
					}
				}				
			}
			cadenaJson.append("]\n");
			cadenaJson.append("}");
		}
		//llamar al servicio
		if(cadenaJson.toString().length()>0){
			try {
				JSONObject jsonEntrada = new JSONObject(cadenaJson.toString());
				
		                URL url = new URL(uri);
		                URLConnection connection = url.openConnection();
		                connection.setDoOutput(true);
		                connection.setRequestProperty("Content-Type", "application/json");
		                connection.setConnectTimeout(5000);
		                connection.setReadTimeout(5000);
		                OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
		                out.write(jsonEntrada.toString());
		                out.close();
		 
		                BufferedReader in = new BufferedReader(new InputStreamReader(
		                        connection.getInputStream()));
		                String salida =in.readLine();
//		                while ((salida=in.readLine()) != null) {
//		                	System.out.println("Salida=>"+salida);
//		                }

		                if(salida!=null && salida.length()>0){
		                	JSONObject jsonSalida = new JSONObject(salida);
		                	JSONArray listaResul=jsonSalida.getJSONArray("direcciones");
		                	JSONObject dire=null;
		                	JSONObject jsonDirecGereferenciado=null;
		                	JSONObject jsonDirecNormalizado=null;
		                	DireccionNormalizada direccionNormalizada=null;
		                	if(listaResul!=null && listaResul.length()>0){
		                		for (int i = 0; i < listaResul.length(); i++) {
		                			dire=listaResul.getJSONObject(i);
		                			direccionNormalizada=new DireccionNormalizada();	
		                			direccionNormalizada.setDireccionOriginal(dire.getString("Direccion Original"));
		                			direccionNormalizada.setUbigeoBean(new UbigeoBean());
		                			direccionNormalizada.getUbigeoBean().setNomDepa(dire.getString("Departamento"));
		                			direccionNormalizada.getUbigeoBean().setNomProvincia(dire.getString("Provincia"));
		                			direccionNormalizada.getUbigeoBean().setNomDistrito(dire.getString("Distrito"));
		                			direccionNormalizada.setEstado(dire.get("Estado").toString());
		                			direccionNormalizada.setMensaje(dire.getString("Mensaje"));
		                			jsonDirecNormalizado=(JSONObject) dire.get("Direccion Normalizada");
		                			direccionNormalizada.setTipoVia(jsonDirecNormalizado.get("Tipo Via").toString());
		                			direccionNormalizada.setUbigeo(jsonDirecNormalizado.get("Ubigeo").toString());
		                			direccionNormalizada.setNombreVia(jsonDirecNormalizado.get("Nombre Via").toString());
		                			direccionNormalizada.setDirecionNorma(direccionNormalizada.getTipoVia()+" "+direccionNormalizada.getNombreVia());
		                			
		                			
		                			
		                			jsonDirecGereferenciado=(JSONObject) dire.get("Direccion Georreferenciado");
		                			direccionNormalizada.setLatitud(jsonDirecGereferenciado.get("posi_lati").toString());
		                			direccionNormalizada.setLongitud(jsonDirecGereferenciado.get("posi_long").toString());		                			
		                			
		                			
		                			
		                			
//		                			
//		                			direccionNormalizada.setDirecionNorma((dire.get("Direccion Normalizada")==null)?"":dire.get("Direccion Normalizada").toString());
//		                			direccionNormalizada.setDireccionGeoreferenciado((dire.get("Direccion Georreferenciado")==null)?"":dire.get("Direccion Georreferenciado").toString());
		                			/******/
		                			cadenaJson2 = 
		               			         "{"+
		               			           "\"posi_lati\" : "+jsonDirecGereferenciado.get("posi_lati")+","+
		               			           "\"posi_long\" : "+jsonDirecGereferenciado.get("posi_long")+","+
		               			           "\"Mensaje\": \""+dire.getString("Direccion Original")+"\""+
		               			         "}".toString();
		                			listaDirec.add(direccionNormalizada);
								}
		                	}          	
		                	
		                	
		                	
		                }
		                System.out.println("\nREST Service Invoked Successfully..");
		                in.close();
				
				
				
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (MalformedURLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		
	}
	//uso web services
	public List<String> filtraDireccion(String direcionParan){
		String ubigeo=null;
		List<String> resul=null;
		if(depa!=null && provicia!=null && distrito!=null){
			try{
				ubigeo=depa.getCodDepa().trim()+provicia.getCodProv().trim()+distrito.getCodDist().trim();
				//implementar web services
				StringBuilder cadenaJsonImput=new StringBuilder();
				cadenaJsonImput.append("{");
				cadenaJsonImput.append("\"ubigeo\":").append("\"").append(ubigeo).append("\",\n");
				cadenaJsonImput.append("\"paranbusqueda\":").append("\"").append(direcionParan).append("\"\n");
				cadenaJsonImput.append("}");
				//llamar al servicio
				if(cadenaJsonImput.toString().length()>0){
					 URL url = new URL(uri_direc);
		                URLConnection connection = url.openConnection();
		                connection.setDoOutput(true);
		                connection.setRequestProperty("Content-Type", "application/json");
		                connection.setConnectTimeout(5000);
		                connection.setReadTimeout(5000);
		                OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
		                out.write(cadenaJsonImput.toString());
		                out.close();		 
		                BufferedReader in = new BufferedReader(new InputStreamReader(
		                        connection.getInputStream()));
		                String salida =in.readLine();
		                JSONArray listaSugerencias=null;
		                if(salida!=null){
		                	resul=new ArrayList<String>();
		                	JSONObject jsonSalida = new JSONObject(salida);
		                	DireccionResponse direccionResponse=null;
		                	JSONObject jsonDirec=null;
		                	listaSugerencias=jsonSalida.getJSONArray("Lista de Sugerencias");
		                	if(listaSugerencias!=null && listaSugerencias.length()>0){
		                		for (int i = 0; i < listaSugerencias.length(); i++) {
		                			jsonDirec=listaSugerencias.getJSONObject(i);
		                			direccionResponse=new DireccionResponse();
		                			direccionResponse.setCodDepa(jsonDirec.getString("codDepa"));
		                			direccionResponse.setCodProv(jsonDirec.getString("codProv"));
		                			direccionResponse.setCodeDist(jsonDirec.getString("codeDist"));
		                			direccionResponse.setNomVia(jsonDirec.getString("nomVia"));
		                			resul.add(jsonDirec.getString("nomVia"));
		                			//listaDirecconResponse.add(direccionResponse);
								}
		                	}
		                	
		                	
		                	
		                	
		                }
				}
			}catch(Exception exception){
				
			}
		}
		return resul;
		
	}
	public List<T0003maesDire> getListaDirecPadron() {
		return listaDirecPadron;
	}

	public void setListaDirecPadron(List<T0003maesDire> listaDirecPadron) {
		this.listaDirecPadron = listaDirecPadron;
	}
	public String json ;

	public String getJson() {
		return json;
	}

	public void setJson(String json) {
		this.json = json;
	}

	public void verDirecionesBatch(){
		String ubigeo=null;
		String cadenaJson;
		UbigeoBean ubigeoBean=null;
////		if(itemsDireccion!=null && itemsDireccion.size()>0){
//			cadenaJson.append("{");
//			cadenaJson.append("\"direcciones\":");
//			cadenaJson.append("[");
////			for (int i = 0; i < itemsDireccion.size(); i++) {
////				ubigeo=itemsDireccion.get(i).split("-")[0];
////				ubigeoBean=direccionService.selectUbigeo(ubigeo);
////				if(ubigeoBean!=null){
////					direccion=itemsDireccion.get(i).split("-")[1];
//					cadenaJson.append("{");
//					cadenaJson.append("\"Direccion Original\":").append("\"").append("ss").append("\",\n");
//					cadenaJson.append("\"Departamento\":").append("\"").append("ddd").append("\",\n");
//					cadenaJson.append("\"Provincia\":").append("\"").append("ddd").append("\",\n");
//					cadenaJson.append("\"Distrito\":").append("\"").append("ddd").append("\"\n");
//					cadenaJson.append("}").append("\n");
////					if(i!=itemsDireccion.size()-1){
////						cadenaJson.append(",").append("\n");
////					}
////				}				
////			}
//			cadenaJson.append("]\n");
//			cadenaJson.append("}");
////		}
		
		
//		 { "tipovia" : "Avenida","nombrevia" : "Javier Prado","direccion": "350","ubigeo": "150131","estado": 1,"mensaje": "Encontrado 1" }
//		 +%7b+%22tipovia%22+%3a+%22Avenida%22%2c%22nombrevia%22+%3a+%22Javier+Prado%22%2c%22direccion%22%3a+%22350%22%2c%22ubigeo%22%3a+%22150131%22%2c%22estado%22%3a+1%2c%22mensaje%22%3a+%22Encontrado+1%22+%7d
//		cadenaJson2 = "{\"direcciones\":[{\"Direcciones Original\": \"Av Javier Prado 350 San Isidro\",\"Ubigeo\": \"150131\",\"Estado\": 1,"+
//		"\"Mensaje\": \"Encontrado\","+
//		"\"Direccion Normalizada\":"+
//			         "{"+
//			          "\"Tipo Via\" : \"Avenida\","+
//			          "\"Nombre Via\" : \"Javier Prado\","+
//			          "\"Ubigeo\" : \"150131\""+
//			         "},"+
//			       "\"Direccion Georreferenciado\":"+
//			         "{"+
//			           "\"posi_lati\" : -12.1234567890,"+
//			           "\"posi_long\" : -12.1234567890"+
//			         "}"+
//			     "}"+
//			   "]"+
//			"}";
		//-77.016345479999984, -12.087620819999927
		/*cadenaJson2 = 
			         "{"+
			           "\"posi_lati\" : -12.087620819999927,"+
			           "\"posi_long\" : -77.016345479999984,"+
			           "\"Mensaje\": \"Encontrado\""+
			         "}".toString();
		cadenaJson= "{\"age\":29,\"messages\":[\"msg 1\",\"msg 2\",\"msg 3\"],\"name\":\"mkyong\"}\"".toString();
		/*Serializar y luego dejar en el atributo json */
		String encodedUrl;
		try {
			JSONObject jsonEntrada = new JSONObject(cadenaJson2);
			
			encodedUrl = URLEncoder.encode(jsonEntrada.toString(), "UTF-8");
			json = encodedUrl ; 
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	public void agregarDireccion(){
		String ubigeo=null;
		
		
		if(depa.getCodDepa()!=null && provicia.getCodProv()!=null 
				&& distrito.getCodDist()!=null ){
			ubigeo=depa.getCodDepa().trim()+provicia.getCodProv().trim()+distrito.getCodDist().trim();
			
			itemsDireccion.add(ubigeo+"-"+direccion);
		}
	}
	public T0008maesDepa getDepa() {
		return depa;
	}

	public void setDepa(T0008maesDepa depa) {
		this.depa = depa;
	}

	public T0009maesProv getProvicia() {
		return provicia;
	}

	public void setProvicia(T0009maesProv provicia) {
		this.provicia = provicia;
	}

	public T0010maesDist getDistrito() {
		return distrito;
	}

	public void setDistrito(T0010maesDist distrito) {
		this.distrito = distrito;
	}

	public String getDireccion() {
		return direccion;
	}

	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}

	public List<String> getItemsDireccion() {
		return itemsDireccion;
	}

	public void setItemsDireccion(List<String> itemsDireccion) {
		this.itemsDireccion = itemsDireccion;
	}
 
}
